﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using migradorWPF.Base;
using System.Collections.ObjectModel;
using migradorWPF.Models;

namespace migradorWPF.Services
{
    /// <summary>
    /// Clase base para las bases de datos, utiliza un conector ADO.NET
    /// </summary>
    public abstract class BDService : BaseService
    {
        public abstract string TypeDb {get; set;}
        public abstract string Host { get; set; }
        public abstract string Port { get; set; }
        public abstract string NombreDb { get; set; }
        public abstract string UserDb { get; set; }
        public abstract string PassUserDb { get; set; }
        public abstract string ErrorBaseDeDatos { get; set; }
        public abstract bool ProcedimientosAlmacenados { get; set; }
        public abstract bool AplicandoParches { get; set; }
        public abstract ObservableCollection<ParcheAplicado> ParchesAplicados { get; set; }

        public abstract bool Desconectar();
        public abstract bool Conectar();
        public abstract void CancelarAplicarParches();        
        public abstract bool ExisteTablaParches();
        public abstract bool CrearTablaParches();
        public abstract bool ExisteConexion();
        public abstract bool ObtenerParchesAplicados();
        public abstract bool AplicarParches(ObservableCollection<ArchivoMigracion> archivo);
        
        /// <summary>
        /// retorna un servicio de base de datos segun el parametro indicado
        /// </summary>
        /// <param name="typeDb"></param>
        /// <returns></returns>
        public static BDService getDbInstance(string typeDb)
        {
            
            if (typeDb.Equals(Constantes.BasesDeDatosSoportadas.SQL_SERVER))
                return new BDServiceADONET(Constantes.BasesDeDatosSoportadas.SQL_SERVER);
            if (typeDb.Equals(Constantes.BasesDeDatosSoportadas.POSTGRESQL))
                return new BDServiceADONET(Constantes.BasesDeDatosSoportadas.POSTGRESQL);
            if (typeDb.Equals(Constantes.BasesDeDatosSoportadas.Oracle10g11g))
                return new BDServiceADONET(Constantes.BasesDeDatosSoportadas.Oracle10g11g);
            if (typeDb.Equals(Constantes.BasesDeDatosSoportadas.Mysql5x))
                return new BDServiceADONET(Constantes.BasesDeDatosSoportadas.Mysql5x);
            return null;    
        }
    }
}
